package com.tripcube.ai.service;

import com.aliyun.bailian20231229.models.AddFileResponseBody;
import com.aliyun.bailian20231229.models.ApplyFileUploadLeaseResponseBody;
import com.aliyun.bailian20231229.models.DescribeFileResponseBody;
import com.tripcube.ai.model.dto.AddFileDTO;
import com.tripcube.common.core.web.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;


/**
 * 文档管理服务接口
 * 提供文档的上传、更新、删除、查询等管理功能
 * * @author tripcube
 */
public interface DocumentService {

    /**
     * 查询文档列表
     * 根据查询条件获取文档列表信息
     * * @param categoryId 文档分类ID
     * @param fileName 文档名称
     * @param nextToken 分页标记
     * @param maxResults 每页最大数量
     * @return 分页文档列表数据
     */
    TableDataInfo selectDocumentList(String categoryId, String fileName, String nextToken, Integer maxResults);

    /**
     * 添加文档
     * * @param addFileDTO 添加文档参数
     *
     * @return 上传后的文档信息
     */
    AddFileResponseBody.AddFileResponseBodyData addDocument(AddFileDTO addFileDTO);

    /**
     * 申请文件上传租约
     * * @param fileName 文件名
     * @param md5 文件MD5值
     * @param sizeInBytes 文件大小（字节）
     * @return 包含上传URL和请求头的Map
     */
    ApplyFileUploadLeaseResponseBody.ApplyFileUploadLeaseResponseBodyData applyUploadLease(String fileName, String md5, String sizeInBytes);

    /**
     * 删除文档
     * 根据文档ID删除指定文档
     * * @param fileId 文档ID
     * @return 删除是否成功
     */
    boolean deleteDocument(String fileId);

    /**
     * 批量删除文档
     * * @param fileIds 文档ID数组
     * @return 删除结果
     */
    int deleteDocuments(List<String> fileIds);

    /**
     * 查询文档状态
     * * @param fileId 文档ID
     *
     * @return 文档详细信息
     */
    DescribeFileResponseBody.DescribeFileResponseBodyData selectDocumentById(String fileId);

    /**
     * 更新文档标签
     * * @param fileId 文档ID
     * @param tags 新的标签数组
     * @return 更新是否成功
     */
    boolean updateDocumentTags(String fileId, List<String> tags);

    /**
     * 从授权OSS导入文件
     * * @param categoryId 目标分类ID
     * @param ossRegionId OSS区域ID
     * @param ossBucketName OSS存储桶名称
     * @param fileDetails 文件列表
     * @param tags 文件标签
     * @return 导入是否成功
     */
    boolean addFilesFromOss(String categoryId, String ossRegionId, String ossBucketName, List<Map<String, String>> fileDetails, List<String> tags);
}